home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / PROGBLER / D86V318A.LZH / D03.DOC < prev    next >
Text File  |  1988-07-20  |  16KB  |  379 lines

  1. CHAPTER 3   REQUIREMENTS AND OPERATION
  2.  
  3.  
  4. System Requirements for D86
  5.  
  6. D86 currently requires either an IBM-PC or compatible computer, a
  7. Texas Instruments TI-PC, a Wang PC, a Tandy 2000, or a Sanyo 550
  8. or 555 computer. The computer must be running MS-DOS V2.00 or
  9. later.  The IBM compatibility must exist at the BIOS and video
  10. interface levels: D86 calls the BIOS to obtain keystrokes and
  11. video status information; and, on an IBM-PC, D86 writes directly
  12. to video memory at segment 0B000 (if the BIOS says monochrome) or
  13. 0B800 (if color).
  14.  
  15. I will be happy to work with you to add support for your
  16. non-IBM-PC compatible MS-DOS computer.  See the end of this
  17. chapter for the first steps in helping me do so.
  18.  
  19. D86 is fairly flexible about memory management.  If there is
  20. enough memory, D86 will take the combined sizes of D86.COM and
  21. A86.COM (currently about 38K bytes), plus 64K bytes for its own
  22. stack, and leave the rest for the program being debugged.  If
  23. memory is tight, D86 will reduce the memory allocated to its own
  24. stack, down to a minimum of 16K bytes.  The segment occupied by
  25. the program being debugged will be similarly reduced.  If the
  26. program is a COM file, you can tell this by the initial SP value,
  27. which is 0FFFE if there is a full 64K, less if there isn't.
  28. Thus, D86 will work with as little as 70K bytes beyond the
  29. operating system; but the symbols capacity and the program's
  30. memory will be severely limited in that case.  It is best to have
  31. at least 166K bytes of memory available when D86 is running.
  32.  
  33.  
  34. Invoking D86
  35.  
  36. You invoke D86 by issuing the command
  37.  
  38.    D86 [+V] [progname [command-tail]]
  39.  
  40. where progname is the name of the program you are debugging.  In
  41. other words, you type a program invocation line just as if you
  42. were about to execute the program without a debugger, except that
  43. you append D86 before the line.
  44.  
  45. The following sections describe in detail the elements of the D86
  46. invocation line, and how D86 acts on them.
  47.  
  48.  
  49.  
  50. Finding the Program File
  51.  
  52. On most other debuggers, you have to give the full file name,
  53. with an explicit extension and a specific directory.  With D86,
  54. you don't: D86 uses almost the same algorithm for locating a
  55. program file that COMMAND.COM does:
  56.  
  57. 1. Look for COM, then EXE, then BAT in the current directory.
  58.  
  59. 2. Look for COM, then EXE, then BAT in each directory in turn
  60.    given in the PATH environment variable.
  61.                                                               3-2
  62.  
  63. The one difference is that D86 will look only for one extension
  64. if you give an explicit extension (and it doesn't have to be COM,
  65. EXE, or BAT).  COMMAND.COM ignores the extension you give-- I
  66. thought that was just too absurd, and didn't duplicate it.
  67.  
  68. A strange feature that I did duplicate is COMMAND.COM's lack of
  69. concern for whether the program is named COM or EXE.  If the
  70. program file begins with a valid EXE header, it's treated as an
  71. EXE no matter what it is named.  If not, then it's treated as a
  72. COM file.
  73.  
  74. D86 provides limited support for BAT files.  (That's better than
  75. other debuggers, which provide no support.)  If your program is a
  76. BAT file, D86 reads the first line of the file and pretends that
  77. that was what you typed following "D86" in your invocation.  The
  78. D86 status screen (gotten via Ctrl-S) gives you this line, and
  79. tells you what BAT file it came from.
  80.  
  81. The BAT file limitations are that D86 doesn't skip over remark
  82. lines, doesn't substitute batch-file parameters, and doesn't
  83. perform console redirection specified in the batch-file line.
  84.  
  85. You can also invoke D86 with no progname.  The debugger comes up
  86. with no program loaded, allowing you to simply poke around the
  87. machine.
  88.  
  89. If D86 had a problem loading your program, you'll see all NOPs in
  90. memory instead of instructions.  You can type Ctrl-S to get the
  91. status screen that tells you what the problem was.
  92.  
  93.  
  94.  
  95. Finding the Symbols File
  96.  
  97. D86 is a symbolic debugger.  It uses a special .SYM file produced
  98. in one of three ways:  First, if your program was produced by
  99. A86, then the .SYM file was produced by A86 at the same time.
  100. Second, if your program was produced by a high-level language
  101. such as Pascal or C, you can feed the linker's .MAP listing to
  102. the special MAPD86 tool, available to registered D86 users only.
  103. Third, you can "reverse engineer" a program by adding symbols
  104. while in D86's patch mode, then create a .SYM file with D86's W
  105. command.
  106.  
  107. When invoked, D86 looks for a file with the program's name and a
  108. .SYM extension.  D86 first looks in the current directory for
  109. this file, and then in each directory specified in the PATH
  110. environment variable.  It is not necessary for the SYM file to
  111. exist.  If there is no SYM file, the debugger simply comes up
  112. with no user symbols defined.  You'll also get no user symbols if
  113. the SYM file was not of a correct format (it wasn't produced in
  114. one of the ways mentioned in the previous paragraph, or it has
  115. been corrupted in some way).  If you were expecting symbols and
  116. didn't get any, you can press Ctrl-S to get the status screen
  117. that tells you what the problem was.
  118.                                                               3-3
  119.  
  120. Two-Screen Debugging with +V
  121.  
  122. The +V option can be used if you have both a monochrome and a
  123. color monitor.  You invoke D86 when the operating system is on
  124. one monitor-- with the +V switch, the debugger will appear on the
  125. other monitor, and program console output will appear on the
  126. operating system's monitor.
  127.  
  128. In order for the +V option to work, you must initialize both
  129. screens by MODEing to them sometime after powering up the
  130. machine. You should also make sure that the blinking cursor is at
  131. the bottom of the screen on which the debugger will appear (the
  132. simplest way to do this is to type ENTER until the prompt gets to
  133. the bottom).  If you can suppress the blinking cursor, that's
  134. even better.  See in your DOS operating manual for instructions
  135. on how to use MODE to switch between screens.  D86 doesn't do the
  136. initialization, because I couldn't figure out how to get the BIOS
  137. to do so without blanking the screen, and you might not want the
  138. screen blanked every time you start a D86 session.
  139.  
  140.  
  141.  
  142. The D86 Screen Display
  143.  
  144. When D86 starts up, it generates a full-screen display, and
  145. awaits your debugger commands.
  146.  
  147. In the top part of the screen is a symbolic disassembly of the
  148. A86 program, with the screen cursor positioned next to the
  149. instruction pointed to by the 8086 instruction pointer.
  150.  
  151. In the lower left corner is a fixed display of the complete 8086
  152. register set.
  153.  
  154. At the top of the second column of the register-set display is a
  155. display of the 8086 flags.  Each flag displays as blank if the
  156. flag is off; a lower case letter if the flag is on:
  157.  
  158.      o   for overflow,
  159.      d   for direction,
  160.      i   for interrupts enabled,
  161.      s   for sign,
  162.      z   for zero,
  163.      a   for auxiliary carry,
  164.      e   for parity even, and
  165.      c   for carry.
  166.  
  167. Across the bottom line of the screen is a display of the contents
  168. of the user stack.  The display begins next to the SP register
  169. value, with the number of elements on the stack.  (The stack is
  170. assumed to have 0 elements when SP is at its original value,
  171. which is 0FFFE for COM files, and a value specified in the header
  172. record for EXE files). The number of elements is followed by a
  173. colon, followed by as many of the top stack elements as fits on
  174. the line.  The initial display will have zero elements; nothing
  175. is yet on the stack.
  176.                                                               3-4
  177.  
  178. To the right of the registers are 6 lines, numbered 1 through 6.
  179. On these lines, you can generate windows into 8086 memory,
  180. displaying bytes, words, or ASCII text in a variety of formats.
  181. The windows can be located either at absolute memory locations,
  182. or be pointed to by any of the 8086 registers.  The commands you
  183. issue to generate these windows are described in Chapter 6.
  184.  
  185.  
  186. D86 Commands
  187.  
  188. There are 5 kinds of activities you perform in D86:
  189.  
  190.    1. Issuing assembly language commands for immediate execution
  191.  
  192.    2. Issuing debugger commands via lines that begin with a
  193.       single letter
  194.  
  195.    3. Issuing debugger commands via the function, Ctrl, and
  196.       cursor-control keys on your keyboard
  197.  
  198.    4. Setting up windows that display memory
  199.  
  200.    5. Issuing assembly language commands to enter into memory
  201.       (PatchMem)
  202.  
  203.  
  204.  
  205. Immediate Assembly Language Commands
  206.  
  207. A primary part of the D86 command language is the A86 assembly
  208. language. With it, you can jump to different areas of your
  209. program, set your registers, perform arithmetic, and call any of
  210. the procedures of your program.  Simply type in any legal A86
  211. instruction, and it will be executed immediately.
  212.  
  213. JMP and RET instructions cause the program counter (and thus also
  214. the disassembly) to move to the indicated destination.  CALL
  215. instructions cause the entire procedure to be executed.
  216.  
  217. WARNING: The immediate-execution feature is a little tricky if
  218. you are in a multi-segment program, of if you jump to exotic
  219. parts of the 86 memory space (i.e., into MSDOS, ROM, video
  220. memory, or the interrupts table). This is because D86 needs a
  221. buffer in which to put the immediate-execution command.  The
  222. buffer should be in your program's CS segment, so that commands
  223. such as jumps and near calls execute correctly.  So D86 must
  224. always search in CS for a satisfactory buffer.  Here is how D86
  225. finds it:
  226.  
  227.   1. If you declare a label D86_BUFFER, pointing to a buffer
  228.      within your program, then D86 will use that buffer as the
  229.      offset for its immediate instruction.
  230.  
  231.   2. If not, then if the program's CS register is the same as its
  232.      SS register, D86 will use (SP-300) as its immediate buffer.
  233.      Thus, your stack should have plenty of room (a good practice
  234.      in general).
  235.                                                               3-5
  236.  
  237.   3. As a last resort, D86 uses offset 00E0, which points to the
  238.      last 32 bytes of the Program Segment Prefix (PSP).  In that
  239.      case, if you were to issue an immediate command that reads
  240.      from a disk file, you would be in trouble, because the
  241.      disk-read operation clobbers the PSP, and the command would
  242.      not be trapped back to the debugger.
  243.  
  244.   In cases 1 and 3 above, the segment containing the buffer is
  245.   the program's CS segment, unless that is out of range (below
  246.   the program's original CS, or above the top of available
  247.   program memory).  If the program CS is out of range, the
  248.   program's original CS is used instead.  In that case, immediate
  249.   instructions such JMP, RET, and CALL will not work correctly.
  250.  
  251.   Note that the above caveats do not apply to single stepping.
  252.  
  253.  
  254.  
  255. Entering Instructions Into Memory
  256.  
  257. D86 allows you to alter 8086 memory in two ways: first, you can
  258. issue immediate assembly language commands which, when executed,
  259. store values in memory.  The other method is to enter a special
  260. mode, in which you enter instructions directly into 8086 memory.
  261.  
  262. You enter this mode by typing the F7 (PatchMem) key. The screen
  263. cursor jumps from the left edge of the line at the current
  264. program counter, into the middle of the line where the
  265. instruction is.  You start typing over the instruction, to signal
  266. that you are clobbering the instruction that was there.  If you
  267. did not intend to enter this mode, you can backspace back to the
  268. start of the instruction, and type a carriage return.
  269.  
  270. Each line you type in is checked for errors.  If there was an
  271. error, a message is displayed, the cursor remains at the same
  272. location, and you try again. If there was no error, the cursor
  273. moves beyond the newly-assembled line, and you can type in
  274. another line.
  275.  
  276. To exit the memory programming mode, you type any of the control
  277. key commands at the beginning of the line.
  278.  
  279.  
  280. Entering Data into 8086 Memory
  281.  
  282. You can deposit data into the 8086 memory space by using the
  283. programming mode described in the above section.  Simply enter DB
  284. and/or DW statements instead of instructions.  Note that ASCII
  285. strings can be entered with the DB instruction; and that arrays
  286. can be initialized via the DUP operator in a DB or DW statement.
  287.                                                               3-6
  288.  
  289. Adding Symbols to a Program
  290.  
  291. Patch mode also allows you to do something that you cannot do in
  292. immediate execution mode: add symbols to the program.  You can do
  293. so by either:
  294.  
  295.    1. Typing in a new symbol name, followed by a colon; or
  296.  
  297.    2. Typing in an EQU directive.
  298.  
  299. There are several uses for this.  First, you might want to create
  300. an abbreviation, by equating a short name to a long one, or to a
  301. hard-to-remember constant value.  Second, you might want to
  302. "reverse engineer" a program for which you have a .COM file, but
  303. not the A86 source code.  Each time you add a label, the
  304. disassembly becomes more readable.  Third, you might want to
  305. label code that you have added in patch mode.
  306.  
  307. After you have added symbols to the table, you can save the
  308. resulting expanded table with the W command.  Simply type W
  309. followed by the ENTER key at the main debugger command level.
  310.  
  311. Forward referencing is allowed when you are in patch mode.  You
  312. must be careful, however, to resolve any forward references you
  313. have made.  In particular, you will cause the assembler to become
  314. very confused if you overwrite a forward reference with some
  315. other code before you resolve the reference.  So don't!
  316.  
  317.  
  318.  
  319. What to Do if D86 Doesn't Work on Your Computer
  320.  
  321. If D86 does not work properly on your system, I would like to
  322. hear about it.
  323.  
  324. If you saw no debugger screen at all when you tried executing D86
  325. HEXOUT, try D86 +V HEXOUT.  Let me know what happens then.
  326.  
  327. I have written a tool called D86CHECK, that outputs information
  328. about your computer system.  Please run D86CHECK to get that
  329. information.  If you are sending me a letter in the mail, you can
  330. direct output to your printer; e.g., D86CHECK >PRN.  If you are
  331. sending me a disk, or a message on the bulletin board, you can
  332. redirect output to a file; e.g. D86CHECK >OUTFILE.
  333.  
  334. Give me the output to D86CHECK, and tell me as much as you can
  335. about the problems you are experiencing.  Also tell me the brand
  336. and model of your computer.  I'll try to see to it that the
  337. problem is fixed.
  338.  
  339. Again, my phone number is (812)339-1811.  I also receive BBS mail
  340. at (812)335-7252 and (812)332-7227.  My address is:
  341.  
  342.    Eric Isaacson
  343.    416 E. University Ave.
  344.    Bloomington, IN 47401-4739
  345.                                                               3-7
  346.  
  347. If You'd Like to Be Ambitious
  348.  
  349. If you are skilled in assembly language programming, you can
  350. write the BIOS interface routines for D86 yourself, and send them
  351. to me.  That's probably the quickest way you'll get D86 up on
  352. your computer.  To do this, you need to get the files XBIOS.8 and
  353. BIOS.8.  These files are included in the D86 package for versions
  354. V3.11 and earlier.  I deleted them starting with V3.12, to make
  355. room on the distribution diskette; but they are still available
  356. in the file D86BIOS*.ARC (where * is a digit that will increment
  357. with new versions).  The file can be downloaded from either of
  358. the BBS systems listed in the previous section.
  359.  
  360. You must add code to BIOS.8 to detect your machine, take a BIOS
  361. keystroke, ring the bell, and copy to your video memory.  If you
  362. do not feel up to actually making the modifications yourself,
  363. then you can send me sufficient documentation about your
  364. computer, that would let me do so.  If you do not know where such
  365. documentation exists, ask your computer dealer or your user's
  366. group.
  367.  
  368. IMPORTANT NOTE: My efforts in porting D86 are done with the
  369. understanding that you will become a registered user.  I would
  370. prefer that you register in advance; if this makes you nervous,
  371. then I will accept a written promise from you that you will
  372. register when I get D86 working on your machine.  (Advance
  373. registrants will get the fastest turnaround.)  I will grant Sysop
  374. status to those of you who are the first to write the program for
  375. your machine: i.e., if you can persuade five other users to
  376. register (and mention your name when they do so), I'll refund
  377. your registration.
  378.  
  379.